<?xml version="1.0" encoding="UTF-8"?>

<!--
    Document   : SRGStoJSGF.xsl
    Created on : Štvrtok, 2012, máj 17, 12:34
    Author     : erich
    Description:
        Purpose of transformation follows.
-->

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:srgs="http://www.w3.org/2001/06/grammar">
    
    <xsl:strip-space 
        elements="srgs:rule srgs:example srgs:item srgs:one-of 
        srgs:token"/>
    <xsl:output method="text"/>
    
    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

    
    <xsl:template name="addlang">
        <xsl:if test="string(@xml:lang)!=''">{<xsl:value-of select="@xml:lang"/>}</xsl:if>
    </xsl:template>
    
    <xsl:template name="addweight">
        <xsl:if test="string(@weight)!=''">/<xsl:value-of select="@weight"/>/ </xsl:if>
    </xsl:template>
    
    <xsl:template name="addrepeat">
        <xsl:choose>
            <xsl:when test="string(@repeat)='0-'">
                <xsl:text>*</xsl:text>
            </xsl:when>
            <xsl:when test="string(@repeat)='1-'">
                <xsl:text>+</xsl:text>
            </xsl:when>
        </xsl:choose>
    </xsl:template>
    
    <xsl:template name="addexamples">
        <xsl:if test="count(srgs:example)>0">
            <xsl:text>/**&#xA;</xsl:text>
            <xsl:for-each select="srgs:example">
                <xsl:text>* @example </xsl:text><xsl:value-of select="text()"/>
                <xsl:text>&#xA;</xsl:text>
            </xsl:for-each>
            <xsl:text>&#xA;*/&#xA;</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="srgs:grammar">
        <xsl:text>#JSGF</xsl:text>
        <xsl:if test="string(@version)!=''"><xsl:text> </xsl:text><xsl:value-of select="@version"/></xsl:if>
        <xsl:if test="string(@encoding)!=''"><xsl:text> </xsl:text><xsl:value-of select="@encoding"/></xsl:if>
        <xsl:if test="string(@xml:lang)!=''"><xsl:text> </xsl:text><xsl:value-of select="@xml:lang"/></xsl:if>
        <xsl:text>;&#xA;</xsl:text>
        <xsl:apply-templates select="srgs:lexicon"/>
        <xsl:text>&#xA;</xsl:text>
        <xsl:apply-templates select="srgs:rule"/>
    </xsl:template>
    
    <xsl:template match="srgs:lexicon">
        <xsl:text>import &lt;</xsl:text><xsl:value-of select="@uri"/><xsl:text>&gt;;</xsl:text>
    </xsl:template>
    
    <xsl:template match="srgs:rule">
        <xsl:call-template name="addexamples"/>
        <xsl:if test="@scope != ''"><xsl:value-of select="@scope"/><xsl:text> </xsl:text></xsl:if>
        <xsl:text>&lt;</xsl:text><xsl:value-of select="@id"/><xsl:text>&gt;</xsl:text> = <xsl:apply-templates/>;
    </xsl:template>
    
    <xsl:template match="srgs:ruleref">
        <xsl:choose>
            <xsl:when test="string(@special)!=''">
                <xsl:choose>
                    <xsl:when test="(translate(string(@special), $smallcase, $uppercase))='GARBAGE'">
                        <xsl:text>&lt;NULL&gt;</xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text>&lt;</xsl:text><xsl:value-of select="translate(string(@special), $smallcase, $uppercase)"/><xsl:text>&gt;</xsl:text>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:otherwise>
                <xsl:choose>
                    <xsl:when test="starts-with(string(@uri),'#')"> 
                    <xsl:text>&lt;</xsl:text><xsl:value-of select="substring-after(@uri,'#')"/><xsl:text>&gt;</xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text>&lt;</xsl:text><xsl:value-of select="@uri"/><xsl:text>&gt;</xsl:text>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:otherwise>
        </xsl:choose> 
    </xsl:template>
    
    <xsl:template match="srgs:tag"> {<xsl:value-of select="."/>} </xsl:template>
    
    <xsl:template match="srgs:one-of">
        <xsl:text>(</xsl:text><xsl:apply-templates/><xsl:text>)</xsl:text>
        <xsl:call-template name="addlang"/>
    </xsl:template>
    
    <xsl:template match="srgs:one-of/srgs:item">
        <xsl:call-template name="addweight"/>
        <xsl:choose>
            <xsl:when test="string(@repeat)='0-1'">
                <xsl:text>[</xsl:text><xsl:apply-templates/><xsl:text>]</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>(</xsl:text><xsl:apply-templates/><xsl:text>)</xsl:text>
                <xsl:call-template name="addrepeat"/>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:call-template name="addlang"/>
        <xsl:if test="not(position()=last())">
            <xsl:text>|</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="srgs:item">
        <xsl:choose>
            <xsl:when test="string(@repeat)='0-1'">
                <xsl:text>[</xsl:text><xsl:apply-templates/><xsl:text>]</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>(</xsl:text><xsl:apply-templates/><xsl:text>)</xsl:text>
                <xsl:call-template name="addrepeat"/>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:call-template name="addlang"/>
    </xsl:template>
    
    <xsl:template match="srgs:example"/>

</xsl:stylesheet>
